package com.project.class4_8.proxy1.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ServiceProxy implements InvocationHandler {
    private Object targetObj;
    public ServiceProxy(Object targetObj){
        this.targetObj = targetObj;
    }

    /**
     * 产生代理对象方法
     * @return 代理对象
     */
    public Object getProxy(){
        return Proxy.newProxyInstance(
                this.targetObj.getClass().getClassLoader(),
                this.targetObj.getClass().getInterfaces(),
                this
        );
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            //得到目标对象的属性列表
            Field[] fieldArray = targetObj.getClass().getDeclaredFields();
            for (Field f : fieldArray) {
                //判断业务组件类属性中，是否有@Auto注解
                if (f.isAnnotationPresent(Auto.class)) {
                    //利用DAO工厂类，根据接口Class对象，找到实现类对象
                    Object obj = DaoFactory.getDao(f.getType());
                    //去掉访问修饰符检查
                    f.setAccessible(true);
                    //将目标对象的属性赋值
                    f.set(targetObj, obj);
                }
            }

            //执行目标对象的目标方法
            method.invoke(targetObj, args);
        }catch (Exception e){
            System.out.println(e.getClass());
            System.out.println(e.getCause().getClass());
        }

        return null;
    }
}
